עזרה ב"עיצוב" מסד
כרגע אפשר לתת רק קטגוריה אחת לכל מאמר והמ.ז. (מספר זיהוי\ID) של קטגוריה שמור בטבלה של מאמרים.
הטבלה של המאמרים כזאת:
post_id, post_title, post_content, post_category_id
הטבלה של הקטגוריות כזאת:
category_id, category_parent_id, category_name
עכשיו שתיהיה את האפשרות שיהיה לכל מאמר כמה קטגוריות צריך מערך קטגוריות, הדרך היחידה שאני יודע שאפשר ליצור מערך במסד מסוג MYSQL זה עוד טבלה (נכון?), אבל אני חושב שזה בזבוז משאבים. יש למישהו רעיון או דוגמאות איך מערכות גדולות כמו WP עובדות?
תודה.
16 תשובות
למה המילה "עיצוב" במרכאות? זה האמא של העיצוב (נשמע טוב יותר באנגלית, design)
מה שקורה לרוב, זה שאת הקטגוריות שמים בטבלה נפרדת של קטגוריות,
כך שלכל קטגוריה יש ID,
ואז את הקטגוריות להן הפוסט שייך אפשר לשמור ב varchar או text פשוט,
עם המספרים של הקטגוריות מופרדים בפסיק.
ואז כדי להוציא את אותן קטגוריות לפי מספרי הקטגורי המופרדים בפסיק אתה משתמש ב IN.
שיהיה בהצלחה.
תודה רבה!
כבר שעה אני מחפש דרך לעבוד עם IN בMYSQL ולא מוצא, למישהו יש מאמר בבקשה?
אם הבנתי אותך נכון:
אז איך אתה שולף את הפוסטים שהקטגורייה שלהם היא ID_CATEGORY=4?
>הרי בעמודה שמשייכת את הפוסט לקטגוריות, אין רק את המספר 4, אלא יש משהו כזה: 1,4,7.
תיצור עוד טבלה עם העמודות:
post_id, cat_id
בטבלה הזו תייצר את הקשרים בין הפוסטים לקטגוריות.
דוגמה:
| post_id cat_id |
+--------------+-------------+
| 1 | 1 |
+--------------+-------------+
| 1 | 2 |
+--------------+-------------+
| 2 | 1 |
+--------------+-------------+
| 3 | 3 |
+--------------+-------------+
עבור הטבלה הזו, זה אומר שהפוסט הראשון שייך לקטגוריות 1 ו-2, פוסט 2 שייך לקטגוריית 2 ופוסט 3 שייך לקטגורית 3.
ככה גם יותר קל למחוק פוסט מסוים מקטגוריה מסוימת (פשוט מוחקים שורה בטבלה) וגם קל להוסיף פוסט לקטגוריה מסוימת (להוסיף שורה חדשה בטבלה).
ד"א - ככה נעשה גם ב-phpguide.
ודרך אגב, בשביל ערכים שמופרדים בפסיקים יש את FIND_IN_SET.
IN לא קשורה לזה.
הבעיה עם SET שהוא צריך להגדיר קטגוריות מראש, ואם זה קטגוריות שהוא מוסיף כל פעם דרך פאנל?
השאילתה פשוטה, זה בסגנון הזה:
SELECT * FROM categories WHERE id IN ({$this_post_categories_string})
FIND_IN_SET מקבלת שתי מחרוזות:
1 - המחרוזת שאנחנו מחפשים.
2 - מחרוזת שהיא רשימת ערכים מופרדים עם פסיק.
SET נשמר במסד כרשימת ערכים מופרדים עם פסיק, ולכן משתמשים ב-FIND_IN_SET כשעובדים עם SET.
אבל אפשר לשלוח ל-FIND_IN_SET כל מחרוזת, אין צורך בעמודה מסוג SET:
ככה שאין צורך להגדיר את העמודה כ-SET בשביל להשתמש בזה.
בנוסף, אני לא ממליץ לעשות את זה ככה (להכניס את הקטגוריות כפסיקים).
עם החיפוש במסד אין בעיה, הבעיה היא כשאתה רוצה להוציא פוסט מסוים מקטגוריה מסוימת או להכניס פוסט מסוים לקטגוריה נוספת (זה פחות בעיה, פשוט משרשרים פסיק+ה-id של הקט', אבל בכל זאת).
אם עושים טבלה נוספת שמקשרת בין הקטגוריות לבין הפוסטים אנחנו פותרים את הבעיתיות הזו.
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set
תודה רבה רבה!!
אני בודק עכשיו הכל, בקרוב אחזיר תשובה.
----
@iiddaannyy
גם ויקימדיה עובדת ככה, אני מכיר את השיטה.
אבל אני חושב שזה ממש בזבוז, תחשוב שיש כבר טבלה למאמרים וטבלה לקטגוריות. עכשיו להוסיף טבלה גם לקשר בניהן? תחשוב על השאילתא:
$post_row = mysql_fetch_assoc($posts_result);
$categories_result = mysql_query("
SELECT
`categories`.`category_name`, `categories`.`category_id`
FROM
`categories`,
`post_categories`
WHERE
`categories`.`category_id` = `post_categories`.`category_id`
AND
`post_categories`.`post_id` = '{$post_row['post_id']}';
") or die(mysql_error());
while($categories_row = mysql_fetch_assoc($categories_result))
{
$post_row['categories'][$categories_row['category_id']] = $categories_row['category_name'];
}
עריכה:
עידן הלכתי על הדרך שהצעת אבל עכשיו יש בעיה חדשה, איך אני שולף "מאמרים דומים"?
(כרגע אני שולף אותם לפי קטגוריה == קטגוריה..)
מה זאת אומרת "מאמרים דומים"? כאלה שהם באותה קטגוריה?
אם לטבלה קוראים tutorials2categories (לקחתי דוגמה מהאתר שלי), עם העמודות tutorial, category ואתה רוצה לשלוף את המדריכים באותה קטגוריה כמו המדריך עם ה-id=1, אז:
FROM (
SELECT `category`
FROM `tutorials2categories`
WHERE `tutorial`=1
) AS `currentCategories`
LEFT JOIN `tutorials2categories`
ON `tutorials2categories`.`category`=`currentCategories`.`category`
WHERE `tutorial`!=1
GROUP BY `tutorial`
וזה כמובן עובד גם אם המדריך שייך לכמה קטגוריות.
וואלה תודה רבה, אני לא אוהב שנותנים לי קודים אז אני אשבור את הראש להבין מה עשית פה ולמה זה עובד.
שוב תודה רבה! ערב טוב.
שמחתי לעזור, בהצלחה. :)